#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "../lib/STM32F10x_StdPeriph_Driver/inc/stm32f10x_exti.h"
#include "../lib/STM32F10x_StdPeriph_Driver/inc/misc.h"
#include "../lib/STM32F10x_StdPeriph_Driver/inc/stm32f10x_gpio.h"
void delay(unsigned int time)
{
	unsigned int i = 0;
	while (time--)
	{
		i = 1000000;
		while (i--)
			;
	}
}

u8 key_read()
{
	u8 result = 0;
	// delay(1);
	// 注意这里是读取InputDataBit
	result = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12);

	return result;
}

void led_init()
{
	GPIO_InitTypeDef led;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	led.GPIO_Pin = GPIO_Pin_13;
	led.GPIO_Mode = GPIO_Mode_Out_PP;
	led.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &led);
	GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
}

void key_init()
{
	GPIO_InitTypeDef key;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	key.GPIO_Pin = GPIO_Pin_12;
	key.GPIO_Mode = GPIO_Mode_IPD; // 因为没事是低电平，所以默认模式是下拉（高电平就是接通状态）
	// led.GPIO_Speed = GPIO_Speed_50MHz; // 不需要设置时钟
	GPIO_Init(GPIOB, &key);
	// GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_RESET);
}

void led_opr(int opr){
	if(1 == opr){
		GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
	}else{
		GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
	}
}

void key_nvid_init(){
	NVIC_InitTypeDef key_nvic;
	key_nvic.NVIC_IRQChannel = EXTI15_10_IRQn; // 绑定中断处理函数（在下面有定义）
	key_nvic.NVIC_IRQChannelCmd = ENABLE; // 使能NVIC中断
	key_nvic.NVIC_IRQChannelPreemptionPriority = 1; // 子通道优先级
	key_nvic.NVIC_IRQChannelSubPriority = 0; // 父通道优先级

}

int main(void)
{
	led_init();
	key_init();
	key_nvid_init();
	while (1)
	{
		if (1 == key_read())
		{
			GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
		}
		else
		{
			GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
		}
	}
	return 1;
}

// 中断函数里面不能延迟，不能阻塞
// 此函数拷贝自startup_stm32f10x_md.s，代表端口范围是10~15，此次端口使用是PB12
static char flag = 0; 
void EXTI15_10_IRQHandler(){
	// 因为范围是10~15，所以触发中断需要判断是否是12
	if(SET == EXTI_GetITStatus(EXTI_Line12)){
		flag = 2; // 演示，说明可以通过设定全局变量的方式做标记，主函数循环读取flag做后续处理
		// 通过UART来发送数据，说明数据已经进入到了中断
		// 如果使用串口，需要在main函数进行初始化
		// uart_send_data(); 
	}
}
